From: Jasper St. Pierre Date: Fri, 21 Dec 2012 12:55:00 +0000 (-0500) Subject: backgroundMenu: Add a context menu on the background actor X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4768 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=fae838b05424078fa1ad8158c82c1676d1a25b1d;p=gnome-shell.git backgroundMenu: Add a context menu on the background actor Allow users to change their wallpaper and launch System Settings from it. https://bugzilla.gnome.org/show_bug.cgi?id=681540 --- diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css index 0e174f275..c06ed563e 100644 --- a/data/theme/gnome-shell.css +++ b/data/theme/gnome-shell.css @@ -2481,3 +2481,9 @@ StScrollBar StButton#vhandle:active { width: 96px; height: 96px; } + +/* Background menu */ + +.background-menu { + -boxpointer-gap: 4px; +} diff --git a/js/Makefile.am b/js/Makefile.am index df389b825..b6fcea733 100644 --- a/js/Makefile.am +++ b/js/Makefile.am @@ -39,6 +39,7 @@ nobase_dist_js_DATA = \ ui/altTab.js \ ui/appDisplay.js \ ui/appFavorites.js \ + ui/backgroundMenu.js \ ui/boxpointer.js \ ui/calendar.js \ ui/checkBox.js \ diff --git a/js/ui/backgroundMenu.js b/js/ui/backgroundMenu.js new file mode 100644 index 000000000..138af05f0 --- /dev/null +++ b/js/ui/backgroundMenu.js @@ -0,0 +1,57 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Clutter = imports.gi.Clutter; +const Lang = imports.lang; +const St = imports.gi.St; +const Shell = imports.gi.Shell; + +const BoxPointer = imports.ui.boxpointer; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; + +const BackgroundMenu = new Lang.Class({ + Name: 'BackgroundMenu', + Extends: PopupMenu.PopupMenu, + + _init: function(source) { + this.parent(source, 0, St.Side.TOP); + + this.addSettingsAction(_("Change Wallpaper..."), 'gnome-background-panel.desktop'); + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.addSettingsAction(_("System Settings"), 'gnome-control-center.desktop'); + + this.actor.add_style_class_name('background-menu'); + + Main.uiGroup.add_actor(this.actor); + this.actor.hide(); + } +}); + +function addBackgroundMenu(actor) { + let cursor = new St.Bin({ opacity: 0 }); + Main.uiGroup.add_actor(cursor); + + actor._backgroundMenu = new BackgroundMenu(cursor); + actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor }); + actor._backgroundManager.addMenu(actor._backgroundMenu); + + function openMenu() { + let [x, y] = global.get_pointer(); + cursor.set_position(x, y); + actor._backgroundMenu.open(BoxPointer.PopupAnimation.FULL); + } + + let clickAction = new Clutter.ClickAction(); + clickAction.connect('long-press', function(action, actor, state) { + if (state == Clutter.LongPressState.QUERY) + return action.get_button() == 1 && !actor._backgroundMenu.isOpen; + if (state == Clutter.LongPressState.ACTIVATE) + openMenu(); + return true; + }); + clickAction.connect('clicked', function(action) { + if (action.get_button() == 3) + openMenu(); + }); + actor.add_action(clickAction); +} diff --git a/js/ui/main.js b/js/ui/main.js index ae0754a08..68cd4499a 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -10,6 +10,7 @@ const Meta = imports.gi.Meta; const Shell = imports.gi.Shell; const St = imports.gi.St; +const BackgroundMenu = imports.ui.backgroundMenu; const Components = imports.ui.components; const CtrlAltTab = imports.ui.ctrlAltTab; const EndSessionDialog = imports.ui.endSessionDialog; @@ -141,6 +142,8 @@ function start() { windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler(); componentManager = new Components.ComponentManager(); + BackgroundMenu.addBackgroundMenu(global.background_actor); + layoutManager.init(); overview.init();